package com.xy;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xy.entity.User;
import com.xy.mapper.UserMapper;
import com.xy.service.UserService;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.web.bind.annotation.RequestParam;
//import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@SpringBootTest
public class MyTest01 {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private UserService userService;//最好不要在同一个类中这个引入  否则会导致循环依赖错误

    @Test
    public void testSelect() {
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }

//    @Test
//    public IPage pageQuery(@RequestParam(value = "1") Integer Num, @RequestParam(value = "10") Integer Size) {
//        Page page = new Page();
//        page.setSize(Size);
//        page.setCurrent(Num);
//
//        //模糊查询
//        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
//        Assert.assertEquals(5,Num);
//
//        //排序
//        wrapper.orderByDesc(User::getUserId);
//        return userService.page(page, wrapper);
//    }

//    @Test
//    public void saveUser(){
//        User user = new User();
//        user.setUserName("哈尔");
//        user.setEmail("121212121");
//        user.setAddress("哈尔滨");
//        user.setMobile("111111111");
//        userMapper.insert(user);
//    }
//
//    @Test
//    public void deleteUser(){
//        Integer id = 421;
//        userMapper.deleteById(id);
//
//        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
//        wrapper.
//    }

    @Test
    public void test02() {
        //增加
//        User user = new User();
//        user.setUserName("小英");
//        userMapper.insert(user);

        //查询所有
//        List<User> users = userMapper.selectList(null);
//        users.stream().forEach(userList -> {
//            System.out.println(userList);
//        });

        //根据多个id进行查询
//        List<Integer> ids = new ArrayList<>();
//        ids.add(421);
//        ids.add(420);
//        ids.add(419);
//        List<User> users = userMapper.selectBatchIds(ids);
//        System.out.println("数据:");
//        System.out.println(users);

//        List<Map<String, Object>> mapList = userMapper.selectMaps(null);
//        System.out.println("数据-------------------:");
//        System.out.println(mapList);存储  原始积累    低储蓄  低收入
//        横财  无理智     加强外在自我  补充内在自我
//        内在自我   打破陷阱   低储蓄能力
//        记录 优点  小事  只记好的  自信    世界上只有一种自我救赎   看透了自我缺失之后

        //删除
//        Integer id1 = 421;
//        userMapper.deleteById(id1);

//         无助->依赖  ->失去自我  我是什么样的人   我要成为什么样的人
        //内在自我  寻求  外在自我    如何让人喜欢自己  需要被看见  被肯定
        //自信:不会渴望外界
    }


    @Test
    public void stream() {
        //需求：1.拿到所有王姓  2.拿到名字长度为3个字的  3.打印
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("王五");
        list.add("王小二");
        list.add("王老五");
        list.add("李四");

        //filter 可以理解为条件过滤  筛选
        list.stream().filter(list1 -> list1.startsWith("王")).filter(list1 -> list1.length() == 3).forEach(System.out::println);

        //获取Stream对象的几种方式(通过集合)  流式操作是通过Stream对象去进行操作的  所以我们需要先获取Stream对象  才能使用他的方法
        Stream<String> stream = list.stream();
        stream.forEach(System.out::println);

        //通过Arrays获取Stream对象  数组
        String[] arr = {};
        Stream<String> stream1 = Arrays.stream(arr);

        //通过Stream流中的of方法
        Stream<Object> of = Stream.of();
    }

    @Test
    public void Stream1() {
        //假设有一个Person类和一个Person列表
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("欧阳雪", 18, "中国", 'F'));
        personList.add(new Person("Tom", 24, "美国", 'M'));
        personList.add(new Person("Harley", 22, "英国", 'F'));
        personList.add(new Person("向天笑", 20, "中国", 'M'));
        personList.add(new Person("李康", 22, "中国", 'M'));
        personList.add(new Person("小梅", 20, "中国", 'F'));
        personList.add(new Person("何雪", 21, "中国", 'F'));
        personList.add(new Person("李康", 22, "中国", 'M'));
        //1. 年龄大于18  filter:过滤掉不满足条件的元素.  forEach:输出元素. ---如果没有终止函数，那么中间函数的代码不会被执行。
        personList.stream().filter(person -> person.getAge() > 18).forEach(System.out::println);
        //2. 找出中国人  并统计个数: count()
        System.out.println(personList.stream().filter(person -> person.getName() == "中国人").count());
        //找出年龄最大和最小
        System.out.println(personList.stream().max(((o1, o2) -> o1.getAge() - o2.getAge())).get());
        System.out.println(personList.stream().min((o1, o2) -> o1.getAge() - o2.getAge()).get());

        //把Person-年龄大于20人--里面名称----新集合。
//        personList.stream().filter(person -> person.getAge() > 20).collect(Collectors.toList()).forEach(System.out::println);
        System.out.println(personList.stream().filter(person -> person.getAge() > 20).map(i -> i.getName()).collect(Collectors.toList()));

        //sorted排序 按照年龄从小到大排序
        System.out.println(personList.stream().sorted((o1, o2) -> o1.getAge() - o2.getAge()).collect(Collectors.toList()));

        //findFirst(): 返回流中的第一个元素，如果流为空则返回一个空的Optional对象。


        //findAny(): 返回流中的任意一个元素，如果流为空则返回一个空的Optional对象
        //anyMatch 判断流中是否存在满足指定条件的元素，一旦找到满足条件的元素，立即返回true，不再继续处理剩余元素。
        //判断有没有姓名为小梅的
        //allMatch 判断流中的所有元素是否都满足指定条件，一旦发现有不满足条件的元素，立即返回false，不再继续处理剩余元素。
        //判断是不是所有姓名都叫小梅


        /**
         * Consumer<T>: 该接口代表接受一个输入参数并且不返回任何结果的操作。它主要用于操作对象。
         *
         * Supplier<T>: 该接口不接受任何参数，它返回一个泛型的值。通常用于提供新的对象。
         *
         * Function<T, R>: 该接口接受一个输入参数，返回一个结果。这是一个功能性接口，其用途是将输入对象转换成不同类型的输出对象。
         *
         * Predicate<T>: 该接口接受一个输入参数，返回一个布尔值结果。这主要用于测试对象的某些属性。
         */

    }

    @Test
    public void Student() {
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student(1, "小美", "王老师", "徐主任"));
        studentList.add(new Student(2, "小明", "李老师", "徐主任"));
        studentList.add(new Student(3, "班杰明", "张老师", "徐主任"));
        studentList.add(new Student(4, "杰克", "邓老师", "徐主任"));
        studentList.add(new Student(5, "鹏安", "刘老师", "徐主任"));
        studentList.add(new Student(6, "蒋诗琪", "吴老师", "徐主任"));
        studentList.add(new Student(7, "贾维斯", "陈老师", "徐主任"));
        studentList.add(new Student(8, "小沈阳", "蔡老师", "徐主任"));
        studentList.add(new Student(9, "徐娇娇", "韩老师", "徐主任"));
        studentList.add(new Student(0, "董明珠", "欧阳老师", "徐主任"));

        //题目1：筛选学生不及格次数3次及3次以上的学生列表
//        studentList.stream().filter(student -> student.getFailCount() > 3).forEach(System.out::println);
        //题目2：筛选班主任和科任老师负责的学生中有多少个不及格次数超过2次的
//        System.out.println(studentList.stream().filter(student -> student.getFailCount() >= 5).collect(Collectors.groupingBy(Student::getChineseTeacher)));
//        System.out.println(studentList.stream().filter(student -> student.getFailCount() >= 5).collect(Collectors.groupingBy(Student::getClassTeacher)));
        //题目3：筛选不及格次数超过2次且班主任不是安妮和张远的
//        System.out.println(studentList.stream().filter(student -> student.getFailCount() > 2 && (!"王老师".equals(student.getClassTeacher())) && !"李老师".equals(student.getChineseTeacher())).collect(Collectors.toList()));
        //题目4：提取学生列表中所有学生的名字
//        System.out.println(studentList.stream().map(student -> student.getName()).collect(Collectors.toList()));
        //题目5：提取不及格次数为0的学生为三好学生并给isMeritStudent 赋值
        System.out.println(studentList.stream().filter(student -> student.getFailCount() == 0).peek(student -> student.setName("维尼")).collect(Collectors.toList()));
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Person {
    private String name;
    private Integer age;
    private String country;
    private char sex;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Student {
    Integer failCount;   //不及格次数
    String name; //姓名
    String chineseTeacher;//科任老师
    String classTeacher;//班主任

}

